// var NUM_PARTICLES = 1000;
var particles = 3;

var DRAG = 0.1,

  i;
var { initPointList } = require("../../points")
var { Point } = require("../../Point");
var Distances = require("./../../lib/distances")
Distances.setNUM_PARTICLES(particles)

var list = initPointList(particles);

list.forEach(v => {
	var p = Math.random() * Math.PI * 2;
	v.vx = 300 * Math.cos(p);
	v.vy = 300 * Math.sin(p);
})

// @ts-ignore
global.list = list

// var pIndex =
//   [[0, -1, 1, 1, -1],
//   [-1, 0, -1, 1, 1],
//   [1, -1, 0, -1, 1],
//   [1, 1, -1, 0, -1],
//   [-1, 1, 1, -1, 0]];

// var pIndex =
//   [[0, -1, 1, 1, -1],
//   [1, 0, -1, 1, 1],
//   [-1, 1, 0, -1, 1],
//   [-1,-1, 1, 0, -1],
//   [1, -1, -1, 1, 0]];

// var pIndex = [
// 	[0, -1, 1], [1, 0, -1], [-1, 1, 0]
// ]


// var pIndex = [
// 	[0, -1, 2], [1, 0, -2], [-1, 2, 0]
// ]

// var pIndex = [
// 	[0, 1, 1, -1], [-1, 0, -1, 1],
// 	[-1, 1, 0, -1], [1, -1, 1, 0]
// ]
// var pIndex = [
// 	[0, 1, -1, 1], [1, 0, 1, -1],
// 	[-1, 1, 0, 1], [1, -1, 1, 0]
// ]

// var pIndex = rInitIndex(particles);

// var pIndex = [
// 	[0, -1, 1, 0, 0, 1],
// 	[1, 0, -1, 0, 1, 0],
// 	[-1, 1, 0, 1, 0, 0],

// 	[1, 0, 0, 0, 1, -1],
// 	[0,1, 0, -1, 0, 1],
// 	[0, 0, 1, 1, -1, 0]
// ]


// var pIndex = [
// 	[0, 1, 0, 0, 1, -1, 0, 0],
// 	[1, 0, 1, 0, -1, 0, -1, 0],
// 	[0, 1, 0, 1, 0, -1, 0, -1],
// 	[0, 0, 1, 0, 0, 0, -1, 1],//4
// 	[0, -1, 0, 0, 0, 1, 0, 0],
// 	[-1, 0, -1, 0, 1, 0, 1, 0],//6
// 	[0, -1, 0, -1, 0, 1, 0, 1],
// 	[0, 0, -1, 1, 0, 0, 1, 0]
// ]

// var pIndex = [
// 	[0, 1, 0, 0, -1, -1, 0, 0],
// 	[-1, 0, 1, 0, -1, 0, -1, 0],
// 	[0, -1, 0, 1, 0, -1, 0, -1],
// 	[0, 0, -1, 0, 0, 0, -1, 1],//4
// 	[0, -1, 0, 0, 0, -1, 0, 0],
// 	[-1, 0, -1, 0, 1, 0, -1, 0],//6
// 	[0, -1, 0, -1, 0, 1, 0, -1],
// 	[0, 0, -1, -1, 0, 0, 1, 0]
// ]
// var pIndex = [
// 	[0, 1, -1, 1], [1, 0, 1, -1],
// 	[-1, 1, 0, 1], [1, -1, 1, 0]
// ]

// var pIndex = [
// 	[0, 1, -1, 1, -1],
// 	[-1, 0, 1, -1, 1],
// 	[1, -1, 0, 1, -1],
// 	[-1, 1, -1, 0, 1],
// 	[1, -1, 1, -1, 0]
// ]
var pIndex = [
	[1, 1, 1], [1, 1, 1], [1, 1, 1]
]

// @ts-ignore
global.pIndex = pIndex

function step7() {
	const distances = Distances.getDistances(list)
	for (i = 0; i < particles; i++) {
		let p = list[i];

		for (let j = i + 1, length2 = particles; j < length2; j++) {
			let pv = { dvx: p.x - list[j].x, dvy: p.y - list[j].y };
			let dist1 = distances[i][j];
			// var pw = list[j].e ^ list[i].e

			list[i].vx -= pv.dvx / (dist1) ** 3 * 50 * pIndex[i][j]
			list[i].vy  -= pv.dvy / (dist1) ** 3 * 50 * pIndex[i][j]

			list[j].vx += pv.dvx / (dist1) ** 3 * 50 * pIndex[j][i]
			list[j].vy += pv.dvy / (dist1) ** 3 * 50 * pIndex[j][i]

		}

		p.x += (p.vx *= DRAG)
		p.y += (p.vy *= DRAG)
	}
	module.exports.refesh && module.exports.refesh()
}

function rInitIndex(n) {
	var ns = Array.from(new Array(n), v => {
		return new Array(n)
	});

	for (let index = 0, len = n; index < len; index++) {
		for (let jindex = index, len = n; jindex < len; jindex++) {
			if (jindex == index) {
				ns[index][jindex] = 0;
				continue;
			} else {
				ns[index][jindex] = Math.floor(Math.random() * 3) - 1
				ns[jindex][index] = ns[index][jindex] * -1
			}
		}
	}
	return ns;
}


setInterval(step7, 10);
module.exports = { list }